<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>SetFormat</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
</head>
<body>

<h1>SetFormat</h1>

<p>设置数学运算得到的整数和浮点数的格式.</p>

<pre class="Syntax">SetFormat, NumberType, Format </pre>
<h3>参数</h3>
<table class="info">
  <tr>
    <td width="15%"><p>NumberType</p>    </td>
    <td width="85%"><p>必须为 IntegerFast, FloatFast, Integer 或 Float (含 fast 的两种模式需要 1.0.48+ 版本支持; 参见 <a href="#Fast">备注</a>).</p>    </td>
  </tr>
  <tr>
    <td>Format</td>
    <td><p>当 <em>NumberType</em> 为 Integer 或 IntegerFast 时, 需要十六进制时在此参数中指定 H 或 HEX, 而十进制时指定 D. 十六进制数必须以前缀 0x 开头 (例如 0xFF). <span class="ver">[AHK_L 42+]:</span> 十六进制整数被格式化为含有小写的 A-F 数字当此参数为 <code>h</code> 而大写当此参数为 <code>H</code>.</p>
      <p><a name="sci" id="sci"></a>当 <em>NumberType</em> 为 Float 或 FloatFast 时, 在此参数中指定 <em>总宽度<strong>.</strong>小数位数</em> (例如 0.6). 在 1.0.46.11+ 版本中, 可以在后面添加字母 "e" 来得到科学计数法表示的结果; 例如 0.6e 或 0.6E (使用大写字母 E 则在每个结果的数字中使用大写 E). 注意: 在 AutoHotkey 1.x 中, 使用科学计数法表示结果时此参数必须包含小数点; 例如 1.0e1 是正确的而 1e1 则错误.</p>
      <p><em>总宽度</em> 通常为 0 表示结果不需要使用空格或零填充. 如果总宽度大于实际宽度, 结果中将使用空格或零填充 (参见 <a href="#Float">备注</a>) 至指定宽度. 注: 总宽度包含小数点的宽度, 同时当总宽度小于实际宽度时, 则使用实际宽度.</p>
    <p><em><a name="DecimalPlaces"></a>小数位数</em> 为要显示的小数部分的位数 (超出部分将进行四舍五入). 注: 如果指定的小数位数大于实际的位数, 则总是使用零填充. 如果为空或零, 则结果中不会显示小数点和小数部分, 即浮点运算的结果会显示为整数而不是浮点数. 默认的小数位数为 6. 注: 如果没有指定小数位数, 则小数位数为 0, 即 1 和 1.0 是一样的.</p>
    <p>填充: 如果 <em>总宽度</em> 大于实际宽度, 结果中将在左边填充空格; 即每个数字将是右对齐的. 要让数字左对齐, 在 <em>总宽度</em> 加上一个负号. 要使用零而不是空格填充, 在 <em>总宽度</em> 前加上一个零 (例如 06.2).</p></td>
  </tr>
</table>

<h3 id="Fast">Fast 与 Slow 模式的比较</h3>
在 1.0.48+ 版本中, 可以使用 IntegerFast 代替 Integer, 而使用 FloatFast 代替 Float.
<ul>
<li><strong>优点</strong>: 快速模式能维持变量缓存整数和浮点数的能力, 这样可以极大地加快数值密集的运算. (相反地, 慢速模式强制将所有的数值结果立即转换并保存为字符串.)</li>
<li><strong><a name="FastDisadv"></a>缺点</strong>: 保存数字到变量时, 快速模式延迟 SetFormat 的效果到脚本实际需要此变量的文本/字符串版本时 (例如要在 <a href="MsgBox.htm">MsgBox</a> 显示变量的内容). 由于不同的 SetFormat 可能同时生效 (例如更多或更少的小数位), 这可能可能导致不可预期的结果. 要让当前的快速模式立即生效, 执行一个像 <em>HexValue <strong>.</strong>= ""</em> 这样的操作, 这个操作中把一个空字符串附加到当前保存在 <em>HexValue</em> 的数字上.</li>
</ul>
<p>如果在脚本的任意位置使用了慢速模式 "Integer" 或 "Float", 即使 SetFormat 命令所在的这行从未执行, 在脚本开始运行时都会禁用整数或浮点数的缓冲.</p>
<h3 id="Float">浮点格式</h3>
<p>在 v1.0.48+, 浮点变量的内部精确度大约为 15 位, 除非在脚本的某处使用了 <em>SetFormat Float</em> (例如慢速模式). 此时, 浮点数保存的精度由 <em><a href="#DecimalPlaces">小数位数</a></em> 决定 (就像 1.0.48 之前的版本那样). 换句话说, 一旦浮点运算的结果保存到变量中, 多余的精度会丢失并且无法通过再进行像 <em>SetFormat, Float, 0.15</em> 这样的计算进行还原. 为了防止精度的丢失, 请避免在脚本中使用 <em>SetFormat Float</em> 或者使用 <a href="#Fast"><em>SetFormat FloatFast</em></a> 代替.</p>
<p>不论当前有效的是快速模式还是慢速模式, 浮点结果和变量都四舍五入到 <em><a href="#DecimalPlaces">小数位数</a></em>, 每当它们被显示或转换到字符串文本时 (例如 <a href="MsgBox.htm">MsgBox</a> 或 <a href="FileAppend.htm">FileAppend</a>). 要查看完整的精度, 使用类似 <em>SetFormat, FloatFast, 0.15</em> 这样的命令.</p>
<p>要把浮点数转换成整数, 使用 <em>Var:=<a href="../Functions.htm#Round">Round</a>(Var)</em>, Var:=<a href="../Functions.htm#Floor">Floor</a>(Var) 或 Var:=<a href="../Functions.htm#Ceil">Ceil</a>(Var). 要把整数转换成浮点数, 给它加上 0.0 (例如 Var+=0.0) 或使用 <em>MyFloat:=<a href="../Functions.htm#Round">Round</a>(MyInteger, 1)</em> 这样的命令.</p>
<p>内置变量 <strong>A_FormatFloat</strong> 包含了当前的浮点格式 (例如 0.6).</p>
<h3 id="Integer">整数格式</h3>
<p>整数运算结果一般显示为十进制, 不是十六进制. 要切换为十六进制, 使用 <em>SetFormat, IntegerFast, Hex. </em>这种方法还可以用来把整数从十进制转换为十六进制 (反之亦然), 如同此页面底部示例演示的那样.</p>
<p>在脚本中指定原义的整数可以写为十六进制或十进制. 十六进制整数都以前缀 0x 开始 (例如 0xA9). 它们可以用于任何需要数字的地方. 例如, <em>Sleep 0xFF</em> 相当于 <em>Sleep 255</em>, 不管当前 SetFormat 中整数格式的设置如何.</p>
<p>AutoHotkey 支持 64 位有符号整数, 其范围从 -9223372036854775808 (-0x8000000000000000) 到 9223372036854775807 (0x7FFFFFFFFFFFFFFF).</p>
<p>内置变量 <strong>A_FormatInteger</strong> 包含了当前的整数格式 (H 或 D).</p>
<h3>一般说明</h3>
<p>如果脚本中没有使用 SetFormat, 整数默认为十进制格式, 而浮点数默认为 <em>总宽度.小数位数</em> = 0.6. 每个新运行的 <a href="../misc/Threads.htm">线程</a> (例如 <a href="../Hotkeys.htm">热键</a>, <a href="Menu.htm">自定义菜单项</a> 或 <a href="SetTimer.htm">计时器</a> 的子程序) 都会以这些设置的默认值开始; 但可以在自动执行段 (脚本的顶部) 使用 SetFormat 改变这些默认值.</p>
<p>旧式的赋值风格如 x=%y% 会忽略任何首尾的空格 (例如填充的). 要避免这种情况, 使用 <a href="AutoTrim.htm">AutoTrim</a> 或 <a href="SetExpression.htm">冒号-等号运算符</a> (例如 x:=y).</p>
<p>使用 <a href="IfIs.htm">if var is number/integer/float</a> 可以判断一个变量的内容是否为数值.</p>
<p>要对一个整数填充零或空格可以不必对其进行浮点运算, 参照此例:</p>
<pre>Var := "          " . Var     <em>; 引号内包含 10 个空格.  要用零填充, 把其中的空格替换为零.</em>
StringRight, Var, Var, 10  <em>; 这里用足够的空格填充 <i>Var</i> 中的数字使其总宽度为 10 个字符.</em>
Var := SubStr("          " . Var, -9)  <em>; 这里单行实现上面两行的操作.</em></pre>
<h3>相关</h3>
<p><a href="SetExpression.htm">表达式赋值 (:=)</a>, <a href="EnvAdd.htm">EnvAdd</a>, <a href="EnvSub.htm">EnvSub</a>, <a href="EnvMult.htm">EnvMult</a>, <a href="EnvDiv.htm">EnvDiv</a>, <a href="AutoTrim.htm">AutoTrim</a>, <a href="IfIs.htm">if var is type</a></p>
<h3>示例</h3>
<pre class="NoIndent">Var = 11.333333 SetFormat, float, 6.2 Var -= 1 <em>; Sets Var to be 10.33 with one leading space because the total width is 6.</em>
SetFormat, float, 0.2 Var += 1 <em>; Sets Var to be 11.33 with no leading spaces.</em>
SetFormat, float, 06.0 Var += 0 <em>; Sets Var to be 000011</em>

<em>; Convert a decimal integer to hexadecimal:</em>
SetFormat, IntegerFast, hex Var += 0 <em>; Sets Var (which previously contained 11) to be 0xb</em>. Var <strong>.</strong>= "" <em>; Necessary due to the "fast" mode.</em>
SetFormat, IntegerFast, d</pre>

</body>
</html>
